package org.dromara.ai.domain.enums;

/**
 * AI服务提供商类型枚举
 *
 * @author RuoYi
 * @since 2024-01-01
 */
public enum AiProviderType {

    /**
     * OpenAI
     */
    OPENAI("openai", "OpenAI", "OpenAI官方API服务"),

    /**
     * Azure OpenAI
     */
    AZURE_OPENAI("azure_openai", "Azure OpenAI", "微软Azure OpenAI服务"),

    /**
     * 百度文心一言
     */
    BAIDU_WENXIN("baidu_wenxin", "百度文心一言", "百度文心一言大模型"),

    /**
     * 阿里通义千问
     */
    ALIBABA_TONGYI("alibaba_tongyi", "阿里通义千问", "阿里巴巴通义千问大模型"),

    /**
     * 腾讯混元
     */
    TENCENT_HUNYUAN("tencent_hunyuan", "腾讯混元", "腾讯混元大模型"),

    /**
     * 讯飞星火
     */
    IFLYTEK_SPARK("iflytek_spark", "讯飞星火", "科大讯飞星火认知大模型"),

    /**
     * 智谱AI
     */
    ZHIPU_AI("zhipu_ai", "智谱AI", "智谱AI大模型"),

    /**
     * 月之暗面Kimi
     */
    MOONSHOT_KIMI("moonshot_kimi", "月之暗面Kimi", "月之暗面Kimi大模型"),

    /**
     * 字节豆包
     */
    BYTEDANCE_DOUBAO("bytedance_doubao", "字节豆包", "字节跳动豆包大模型"),

    /**
     * 自定义提供商
     */
    CUSTOM("custom", "自定义", "自定义AI服务提供商");

    /**
     * 提供商代码
     */
    private final String code;

    /**
     * 提供商名称
     */
    private final String name;

    /**
     * 提供商描述
     */
    private final String description;

    AiProviderType(String code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据代码获取提供商类型
     *
     * @param code 提供商代码
     * @return 提供商类型
     */
    public static AiProviderType fromCode(String code) {
        for (AiProviderType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return CUSTOM;
    }

    /**
     * 根据名称获取提供商类型
     *
     * @param name 提供商名称
     * @return 提供商类型
     */
    public static AiProviderType fromName(String name) {
        for (AiProviderType type : values()) {
            if (type.getName().equals(name)) {
                return type;
            }
        }
        return CUSTOM;
    }
}